/*********************************************************************
 * Copyright (C) 2002 Andrew Khan
 * <p>
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * <p>
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * <p>
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ***************************************************************************/

package jxl.write;

import jxl.format.Colour;
import jxl.format.Font;
import jxl.format.ScriptStyle;
import jxl.format.UnderlineStyle;
import jxl.write.biff.WritableFontRecord;

/**
 * A class which is instantiated when the user application wishes to specify
 * the font for a particular cell
 */
public class WritableFont extends WritableFontRecord {
    /**
     * Static inner class used for classifying the font names
     */
    public static class FontName {
        /**
         * The name
         */
        String name;

        /**
         * Constructor
         *
         * @param s the font name
         */
        FontName(String s) {
            name = s;
        }
    }

    /**
     * Static inner class used for the boldness of the fonts
     */
  /*private*/ static class BoldStyle {
        /**
         * The value
         */
        public int value;

        /**
         * Constructor
         *
         * @param val the value
         */
        BoldStyle(int val) {
            value = val;
        }
    }

    /**
     * Objects created with this font name will be rendered within Excel as ARIAL
     * fonts
     */
    public static final FontName ARIAL = new FontName("Arial");
    /**
     * Objects created with this font name will be rendered within Excel as TIMES
     * fonts
     */
    public static final FontName TIMES = new FontName("Times New Roman");
    /**
     * Objects created with this font name will be rendered within Excel as
     * COURIER fonts
     */
    public static final FontName COURIER = new FontName("Courier New");
    /**
     * Objects created with this font name will be rendered within Excel as
     * TAHOMA fonts
     */
    public static final FontName TAHOMA = new FontName("Tahoma");

    // The bold styles

    /**
     * Indicates that this font should not be presented as bold
     */
    public static final BoldStyle NO_BOLD = new BoldStyle(0x190);
    /**
     * Indicates that this font should be presented in a BOLD style
     */
    public static final BoldStyle BOLD = new BoldStyle(0x2bc);

    /**
     * The default point size for all Fonts
     */
    public static final int DEFAULT_POINT_SIZE = 10;

    /**
     * Creates a default font, vanilla font of the specified face and with
     * default point size.
     *
     * @param fn the font name
     */
    public WritableFont(FontName fn) {
        this(fn,
                DEFAULT_POINT_SIZE,
                NO_BOLD,
                false,
                UnderlineStyle.NO_UNDERLINE,
                Colour.BLACK,
                ScriptStyle.NORMAL_SCRIPT);
    }

    /**
     * Publicly available copy constructor
     *
     * @param f the font to copy
     */
    public WritableFont(Font f) {
        super(f);
    }

    /**
     * Constructs of font of the specified face and of size given by the
     * specified point size
     *
     * @param ps the point size
     * @param fn the font name
     */
    public WritableFont(FontName fn, int ps) {
        this(fn, ps, NO_BOLD, false,
                UnderlineStyle.NO_UNDERLINE,
                Colour.BLACK,
                ScriptStyle.NORMAL_SCRIPT);
    }

    /**
     * Creates a font of the specified face, point size and bold style
     *
     * @param ps the point size
     * @param bs the bold style
     * @param fn the font name
     */
    public WritableFont(FontName fn, int ps, BoldStyle bs) {
        this(fn, ps, bs, false,
                UnderlineStyle.NO_UNDERLINE,
                Colour.BLACK,
                ScriptStyle.NORMAL_SCRIPT);
    }

    /**
     * Creates a font of the specified face, point size, bold weight and
     * italicised option.
     *
     * @param ps the point size
     * @param bs the bold style
     * @param italic italic flag
     * @param fn the font name
     */
    public WritableFont(FontName fn, int ps, BoldStyle bs, boolean italic) {
        this(fn, ps, bs, italic,
                UnderlineStyle.NO_UNDERLINE,
                Colour.BLACK,
                ScriptStyle.NORMAL_SCRIPT);
    }

    /**
     * Creates a font of the specified face, point size, bold weight,
     * italicisation and underline style
     *
     * @param ps the point size
     * @param bs the bold style
     * @param us the underline style
     * @param fn the font name
     * @param it italic flag
     */
    public WritableFont(FontName fn,
                        int ps,
                        BoldStyle bs,
                        boolean it,
                        UnderlineStyle us) {
        this(fn, ps, bs, it, us, Colour.BLACK, ScriptStyle.NORMAL_SCRIPT);
    }


    /**
     * Creates a font of the specified face, point size, bold style,
     * italicisation, underline style and colour
     *
     * @param ps the point size
     * @param bs the bold style
     * @param us the underline style
     * @param fn the font name
     * @param it italic flag
     * @param c the colour
     */
    public WritableFont(FontName fn,
                        int ps,
                        BoldStyle bs,
                        boolean it,
                        UnderlineStyle us,
                        Colour c) {
        this(fn, ps, bs, it, us, c, ScriptStyle.NORMAL_SCRIPT);
    }


    /**
     * Creates a font of the specified face, point size, bold style,
     * italicisation, underline style, colour, and script
     * style (superscript/subscript)
     *
     * @param ps the point size
     * @param bs the bold style
     * @param us the underline style
     * @param fn the font name
     * @param it the italic flag
     * @param c the colour
     * @param ss the script style
     */
    public WritableFont(FontName fn,
                        int ps,
                        BoldStyle bs,
                        boolean it,
                        UnderlineStyle us,
                        Colour c,
                        ScriptStyle ss) {
        super(fn.name, ps, bs.value, it,
                us.getValue(),
                c.getValue(), ss.getValue());
    }

    /**
     * Sets the point size for this font, if the font hasn't been initialized
     *
     * @param pointSize the point size
     * @exception WriteException, if this font is already in use elsewhere
     */
    public void setPointSize(int pointSize) throws WriteException {
        super.setPointSize(pointSize);
    }

    /**
     * Sets the bold style for this font, if the font hasn't been initialized
     *
     * @param boldStyle the bold style
     * @exception WriteException, if this font is already in use elsewhere
     */
    public void setBoldStyle(BoldStyle boldStyle) throws WriteException {
        super.setBoldStyle(boldStyle.value);
    }

    /**
     * Sets the italic indicator for this font, if the font hasn't been
     * initialized
     *
     * @param italic the italic flag
     * @exception WriteException, if this font is already in use elsewhere
     */
    public void setItalic(boolean italic) throws WriteException {
        super.setItalic(italic);
    }

    /**
     * Sets the underline style for this font, if the font hasn't been
     * initialized
     *
     * @param us the underline style
     * @exception WriteException, if this font is already in use elsewhere
     */
    public void setUnderlineStyle(UnderlineStyle us) throws WriteException {
        super.setUnderlineStyle(us.getValue());
    }

    /**
     * Sets the colour for this font, if the font hasn't been
     * initialized
     *
     * @param colour the colour
     * @exception WriteException, if this font is already in use elsewhere
     */
    public void setColour(Colour colour) throws WriteException {
        super.setColour(colour.getValue());
    }

    /**
     * Sets the script style (eg. superscript, subscript) for this font,
     * if the font hasn't been initialized
     *
     * @param scriptStyle the colour
     * @exception WriteException, if this font is already in use elsewhere
     */
    public void setScriptStyle(ScriptStyle scriptStyle) throws WriteException {
        super.setScriptStyle(scriptStyle.getValue());
    }

    /**
     * Accessor for the strike-out flag
     *
     * @return the strike-out flag
     */
    public boolean isStruckout() {
        return super.isStruckout();
    }

    /**
     * Sets Accessor for the strike-out flag
     *
     * @param struckout TRUE if this is a struckout font
     * @return the strike-out flag
     * @exception WriteException, if this font is already in use elsewhere
     */
    public void setStruckout(boolean struckout) throws WriteException {
        super.setStruckout(struckout);
    }

    /**
     * Factory method which creates the specified font name.  This method
     * should be used with care, since the string used to create the font
     * name must be recognized by Excel's internal processing
     *
     * @param fontName the name of the Excel font
     * @return the font name
     */
    public static FontName createFont(String fontName) {
        return new FontName(fontName);
    }
}

